package br.com.foxinline.servico.titulodocumento;

import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.ep.Parte;
import br.com.foxinline.modelo.ep.SeloEP;
import br.com.foxinline.modelo.titulodocumento.TituloDocumento;
import br.com.foxinline.servico.ServicoGenerico;
import br.com.foxinline.utilitario.Caracteres;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author cadomeireles
 */
@Stateless
public class TituloDocumentoServico extends ServicoGenerico<TituloDocumento> {

    public TituloDocumentoServico() {
        super(TituloDocumento.class);
    }

    @Override
    public void deletar(TituloDocumento tituloDocumento) {
        tituloDocumento.setAtivo(false);
        super.atualizar(tituloDocumento);
    }
    
    public List<TituloDocumento> pesquisar(TituloDocumento tituloDocumento, Parte parte) {
        String sql = "select tituloDocumento from TituloDocumento tituloDocumento";

        boolean tipoPessoa = false;
        
        if (    
                parte.getPessoa().getNome() != null && !parte.getPessoa().getNome().isEmpty() ||
                parte.getPessoa().getCpf() != null && !parte.getPessoa().getCpf().isEmpty() ||
                parte.getPessoa().getCnpj() != null && !parte.getPessoa().getCnpj().isEmpty() ||
                parte.getQualidade() != null) {
            sql += " join tituloDocumento.partes partes where partes.pessoa.tipoPessoa = :tipoPessoa and tituloDocumento.ativo = true";
            tipoPessoa = true;
        } else {
            sql += " where tituloDocumento.ativo = true";
        }

        if (parte.getPessoa().getNome() != null && !parte.getPessoa().getNome().isEmpty()) {
            sql += " and lower(partes.pessoa.nome) like '%" + parte.getPessoa().getNome().toLowerCase() + "%'";
        }

        if (parte.getPessoa().getCpf() != null && !parte.getPessoa().getCpf().isEmpty()) {
            sql += " and partes.pessoa.cpf like '%" + Caracteres.removecaracter(parte.getPessoa().getCpf()) + "%'";
        }

        if (parte.getPessoa().getCnpj() != null && !parte.getPessoa().getCnpj().isEmpty()) {
            sql += " and partes.pessoa.cnpj like '%" + Caracteres.removecaracter(parte.getPessoa().getCnpj()) + "%'";
        }       

        if (parte.getQualidade() != null) {
            sql += " and partes.qualidade = :qualidade";
        }        
        
        if (tituloDocumento.getNumero() != null && !tituloDocumento.getNumero().isEmpty()) {
            sql += " and tituloDocumento.numero like '%" + tituloDocumento.getNumero() + "%'";
        }
        
        if (tituloDocumento.getAtoTipo() != null) {
            sql += " and tituloDocumento.atoTipo = :tipo";
        }
                
        if (tituloDocumento.getData() != null) {
            sql += " and tituloDocumento.data = :data";
        }   
        
        if (tituloDocumento.getLivro() != null && !tituloDocumento.getLivro().isEmpty()) {
            sql += " and tituloDocumento.livro like '%" + tituloDocumento.getLivro() + "%'";
        }

        if (tituloDocumento.getLivroComplemento() != null && !tituloDocumento.getLivroComplemento().isEmpty()) {
            sql += " and tituloDocumento.livroComplemento like '%" + tituloDocumento.getLivroComplemento() + "%'";
        }        
        
        if (tituloDocumento.getFolha() != null && !tituloDocumento.getFolha().isEmpty()) {
            sql += " and tituloDocumento.folha like '%" + tituloDocumento.getFolha() + "%'";
        }
        
        if (tituloDocumento.getFolhaComplemento() != null && !tituloDocumento.getFolhaComplemento().isEmpty()) {
            sql += " and tituloDocumento.folhaComplemento like '%" + tituloDocumento.getFolhaComplemento() + "%'";
        }

        Query query = getEntityManager().createQuery(sql);
        
        if (tituloDocumento.getAtoTipo() != null) {
            query.setParameter("tipo", tituloDocumento.getAtoTipo());
        }
        
        if (tituloDocumento.getData() != null) {
            query.setParameter("data", tituloDocumento.getData());
        }           

        if (parte.getQualidade() != null) {
            query.setParameter("qualidade", parte.getQualidade());
        }
        
        if (tipoPessoa) {
            query.setParameter("tipoPessoa", parte.getPessoa().getTipoPessoa());
        }
        
        return query.getResultList(); 
    }    

    public List<Parte> obterPartes(TituloDocumento tituloDocumento) {
    
        String sql = "select tituloDocumento.partes from TituloDocumento tituloDocumento where tituloDocumento.ativo = true and tituloDocumento = :tituloDocumento";
        
        Query query = getEntityManager().createQuery(sql);
        
        if (tituloDocumento != null && tituloDocumento.getId() != null) {
            query.setParameter("tituloDocumento", tituloDocumento);
        }

        return query.getResultList();
    }
    
    public List<SeloEP> obterSelos(TituloDocumento tituloDocumento) {
    
        String sql = "select tituloDocumento.selosEP from TituloDocumento tituloDocumento where tituloDocumento.ativo = true and tituloDocumento = :tituloDocumento";
        
        Query query = getEntityManager().createQuery(sql);
        
        if (tituloDocumento != null && tituloDocumento.getId() != null) {
            query.setParameter("tituloDocumento", tituloDocumento);
        }

        return query.getResultList();
    }    

    public List<Anexo> obterAnexos(TituloDocumento tituloDocumento) {
        String sql = "select tituloDocumento.anexos from TituloDocumento tituloDocumento where tituloDocumento.ativo = true and tituloDocumento = :tituloDocumento";
                
        Query query = getEntityManager().createQuery(sql);

        if (tituloDocumento.getId() != null) {
            query.setParameter("tituloDocumento", tituloDocumento);
        }        
        
        return query.getResultList();     
    }

}
